const fs = require("fs");
const path = require("path");
const { execSync } = require("child_process");

// 引入FFmpeg路径
const { FFMPEG_PATH } = require("../src/utils/ffmpeg");

// 定义文件路径
const wavFile = path.join(__dirname, "../input/voice/tada.wav");
const mp3File = path.join(__dirname, "../input/mp3/16.mp3");
const outputFile = path.join(__dirname, "../test-scripts/mixed_audio_output.mp3");

console.log("测试音频混合功能");
console.log("====================");

// 检查文件是否存在
if (!fs.existsSync(wavFile)) {
  console.error(`错误: WAV文件不存在: ${wavFile}`);
  process.exit(1);
}

if (!fs.existsSync(mp3File)) {
  console.error(`错误: MP3文件不存在: ${mp3File}`);
  process.exit(1);
}

console.log(`WAV文件: ${wavFile}`);
console.log(`MP3文件: ${mp3File}`);
console.log(`输出文件: ${outputFile}`);

// 构建FFmpeg命令来混合两个音频，保持第二个音频（MP3）的时长
// 使用amix滤镜混合音频，duration=first参数确保输出长度与第一个输入相同
// 但我们需要第二个音频的长度，所以需要先获取第二个音频的时长
try {
  // 获取MP3文件时长
  const getDurationCommand = `"${FFMPEG_PATH}" -i "${mp3File}" 2>&1 | findstr "Duration"`;
  console.log("\n获取MP3文件时长...");
  const durationOutput = execSync(getDurationCommand, { encoding: "utf8" });
  console.log(`时长信息: ${durationOutput.trim()}`);

  // 从输出中提取时长并转换为秒
  const durationMatch = durationOutput.match(/Duration: (\d+):(\d+):(\d+\.\d+)/);
  let mp3DurationSeconds = 0;
  if (durationMatch) {
    const hours = parseInt(durationMatch[1]);
    const minutes = parseInt(durationMatch[2]);
    const seconds = parseFloat(durationMatch[3]);
    mp3DurationSeconds = hours * 3600 + minutes * 60 + seconds;
    console.log(`MP3时长(秒): ${mp3DurationSeconds}`);
  }

  // 构建混合音频的命令
  // 使用amix滤镜混合两个音频，然后使用atrim确保输出长度等于第二个音频的长度
  // 将所有音频过滤器都放在filter_complex中
  const mixCommand = `"${FFMPEG_PATH}" -i "${wavFile}" -i "${mp3File}" -filter_complex "[0:a][1:a]amix=inputs=2:duration=longest,atrim=0:${mp3DurationSeconds}" -c:a libmp3lame -q:a 4 "${outputFile}"`;

  console.log("\n执行音频混合命令:");
  console.log(mixCommand);

  execSync(mixCommand, { stdio: "inherit" });

  if (fs.existsSync(outputFile)) {
    console.log("\n✅ 音频混合成功完成!");
    console.log(`输出文件位置: ${outputFile}`);

    // 检查输出文件时长
    const checkDurationCommand = `"${FFMPEG_PATH}" -i "${outputFile}" 2>&1 | findstr "Duration"`;
    console.log("\n检查输出文件时长...");
    try {
      const outputDuration = execSync(checkDurationCommand, { encoding: "utf8" });
      console.log(`输出文件时长: ${outputDuration.trim()}`);
    } catch (e) {
      console.log("无法获取输出文件时长信息");
    }
  } else {
    console.error("\n❌ 音频混合失败，输出文件未生成");
    process.exit(1);
  }
} catch (error) {
  console.error("\n❌ 音频混合过程中发生错误:", error.message);
  process.exit(1);
}

console.log("\n测试完成");
